package com.gitee.qdbp.general.system.api.permission.service;

import java.util.List;
import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.general.system.api.permission.model.ResourceCascadeBean;
import com.gitee.qdbp.general.system.api.permission.model.ResourceCoreBean;

/**
 * 权限资源层级业务接口
 *
 * @author zhaohuihua
 * @version 170505
 */
public interface IResourceCascadeQueryer {

    /**
     * 将平级结构的权限资源封装为层级结构
     * 
     * @param list 平级结构的权限资源列表
     * @param upgrade 未找到上级节点的是否升级为顶级节点
     * @return 带层级结构的权限资源根节点
     * @throws ServiceException
     */
    <T extends ResourceCoreBean> ResourceCascadeBean wrap(List<T> list, boolean upgrade) throws ServiceException;

    /**
     * 将平级结构的权限资源封装为层级结构<br>
     * 未找到上级节点的将被抛弃
     * 
     * @param list 平级结构的权限资源列表
     * @return 带层级结构的权限资源根节点
     * @throws ServiceException
     */
    default <T extends ResourceCoreBean> ResourceCascadeBean wrap(List<T> list) throws ServiceException {
        return wrap(list, false);
    }

    /**
     * 将平级结构的权限资源封装为层级结构, 并添加到节点的children中
     * 
     * @param root 权限资源根节点
     * @param list 平级结构的权限资源列表
     * @param upgrade 未找到上级节点的是否升级为顶级节点
     * @throws ServiceException
     */
    <T extends ResourceCoreBean> void wrap(ResourceCascadeBean root, List<T> list, boolean upgrade) throws ServiceException;

    /**
     * 将平级结构的权限资源封装为层级结构, 并添加到节点的children中<br>
     * 未找到上级节点的将被抛弃
     * 
     * @param root 权限资源根节点
     * @param list 平级结构的权限资源列表
     * @throws ServiceException
     */
    default <T extends ResourceCoreBean> void wrap(ResourceCascadeBean root, List<T> list) throws ServiceException {
        this.wrap(root, list, false);
    }

}
